package Q8_14_Boolean_Evaluation;
public class QuestionC {
public static int count = 0;
public static boolean stringToBool(String c) {
return c.equals("1") ? true : false;
}
public static int countEval(String s, boolean result) {
count++;
if (s.length() == 0) return 0;
if (s.length() == 1) return stringToBool(s) == result ? 1 : 0;
int ways = 0;
for (int i = 1; i < s.length(); i += 2) {
char c = s.charAt(i);
String left = s.substring(0, i);
String right = s.substring(i + 1, s.length());
int subWays = 0;
if (c == '^') { // required: one true and one false
if (result) {
int leftTrue = countEval(left, true);
int leftFalse = countEval(left, false);
int rightTrue = countEval(right, true);
int rightFalse = countEval(right, false);
subWays = leftTrue * rightFalse + leftFalse * rightTrue;
} else {
int leftTrue = countEval(left, true);
int leftFalse = countEval(left, false);
int rightTrue = countEval(right, true);
int rightFalse = countEval(right, false);
subWays = leftTrue * rightTrue + leftFalse * rightFalse;
}
} else if (c == '&') { // required: both true
if (result) {
int leftTrue = countEval(left, true);
int rightTrue = countEval(right, true);
subWays = leftTrue * rightTrue;
} else {
int leftTrue = countEval(left, true);
int leftFalse = countEval(left, false);
int rightTrue = countEval(right, true);
int rightFalse = countEval(right, false);
subWays = leftTrue * rightFalse + leftFalse * rightTrue + leftFalse * rightFalse;
}
} else if (c == '|') { // required: anything but both false
if (result) {
int leftTrue = countEval(left, true);
int leftFalse = countEval(left, false);
int rightTrue = countEval(right, true);
int rightFalse = countEval(right, false);
subWays = leftTrue * rightFalse + leftFalse * rightTrue + leftTrue * rightTrue;
} else {
int leftFalse = countEval(left, false);
int rightFalse = countEval(right, false);
subWays = leftFalse * rightFalse;
}
}
ways += subWays;
}
return ways;
}
public static void main(String[] args) {
String expression = "0&0&0&1^1|0";
boolean result = true;
System.out.println(countEval(expression, result));
System.out.println(count);
}
}